// function test(c: Function) {
//     console.log(c);
// }


// @test
// class Utils {

//     constructor() {

//     }

  
//     myname: string = "刘兵"

//     getName() {

//     }
// }
// var utils = new Utils

// console.log(utils);



// function classDecorator<T extends {new(...args:any[]):{}}>(constructor:T) {
//     return class extends constructor {
//         newProperty = "new property";
//         hello = "override";

//         getname() {
//             return "getname"
//         }
//     }
// }

// @classDecorator
// class Greeter {
//     [x: string]: any;
//     property = "property";
//     hello: string;
//     constructor(m: string) {
//         this.hello = m;
//     }

//     gettest() {}
// }

// var ddd = new Greeter("world")
// console.log(ddd.hello);
// console.log(ddd.property);
// console.log(ddd.newProperty);
// console.log(ddd.getname());


// // 装饰器的案例
// import "reflect-metadata";

// type c = {new(...args:any[]):{}}
// let constructorMap: Map<string,c> = new Map()

// function zhuru() {
//     return function (target: any, propertyKey: any) {

//         let type = Reflect.getMetadata("design:type", target, propertyKey);
//         // console.log("type: ", type);
//         target[propertyKey] = new type
        
//         // console.log(target);
//         // console.log(propertyKey);
//         // console.log(constructorMap.get(propertyKey));
//         // if (constructorMap.get(propertyKey) == undefined) {
//         //     throw new Error(`当前属性名${propertyKey}所对应的类未被装饰器 @shouji 进行收集，请检查`)
//         // } else {
//         //     target[propertyKey] = new (<c>constructorMap.get(propertyKey))
//         // }
//     }
// }


// // function shouji(classObj: c) {
// //    constructorMap.set(classObj.prototype.constructor.name, classObj)
// // }


// // @shouji
// class Utils {
//     time() {
//      return "time"
//     }
//     query() {
//      console.log("query");
//     }
//  }

// // 依赖注入
// //  类的属性来注入
// //  参数来注入
// class Index {

//     @zhuru()
//     Utils!: Utils;

//     constructor() {

//     }
    

//     getIndexData() {
//         return this.Utils.time()
//     }
// }

// var index = new Index()
// console.log(index.getIndexData());
